package com.xiongkw.utils;

import java.math.BigDecimal;

/**
 * @author zhaoyong
 * @desc 距离计算函数
 * @date 2019/10/27 09:08
 */
public class GeoDistanceUtils {

    /**
     * 3.14159265359
     */
    private static double DEF_PI = Math.PI;

    /**
     * 6.28318530712
     */
    private static double DEF_2PI = 2 * Math.PI;

    /*
     * 0.01745329252
     */
    private static double DEF_PI180 = Math.PI / 180.0;

    /**
     * 地球的半径
     */
    private static double DEF_R = 6370996.81;

    /**
     * 通过两点的经纬度计算两点直线距离
     *
     * @return 返回的值四舍五入并保留两位小数, 单位米
     */
    public static Double getDistance(double lng1, double lat1, double lng2, double lat2) {

        // 角度转换为弧度
        double ew1 = lng1 * DEF_PI180;
        double ns1 = lat1 * DEF_PI180;
        double ew2 = lng2 * DEF_PI180;
        double ns2 = lat2 * DEF_PI180;

        // 求大圆劣弧与球心所夹的角(弧度)
        double distance = Math.sin(ns1) * Math.sin(ns2) + Math.cos(ns1) * Math.cos(ns2) * Math.cos(ew1 - ew2);
        // 调整到[-1..1]范围内，避免溢出
        if (distance > 1.0) distance = 1.0;
        else if (distance < -1.0) distance = -1.0;
        distance = DEF_R * Math.acos(distance);

        //格式化返回值
        BigDecimal bd = new BigDecimal(distance);
        return distance = bd.setScale(8, BigDecimal.ROUND_HALF_UP).doubleValue();
    }


}
